import java.util.Stack;

public class MotorCautare 
{
	
    protected final int MAX=100;
    protected Ruta rute[]=new Ruta[MAX];
    protected int nrRute=0;
    


	@SuppressWarnings("rawtypes")
	public Stack s=new Stack();
    
    public void adaugaRuta(String p, String d, int distanta, boolean skip, boolean rutier, boolean feroviar, boolean fluvial)
    {
            if(nrRute<MAX)
            {
                    Ruta z=new Ruta(p, d, distanta, skip, rutier, feroviar, fluvial);
                    rute[nrRute]=z;
                    nrRute++;
            }
            else 
                    System.out.println("Nu mai poate fi adaugata nicio ruta!");
    }
    public void setup()
    {

            adaugaRuta("Recas", "Topolovat", 21, false, true, true, false);
            adaugaRuta("Topolovat", "Lugoj", 10,false, true, true, false);
            adaugaRuta("Jebel", "Deta", 20, false, true, true, false);
            adaugaRuta("Jebel", "Ciacova", 10, false, true, true, false);
            adaugaRuta("Ciacova", "Deta", 18,false, true, true, false);
            adaugaRuta("Deta", "Vrsac", 34, false, true, true, false);
            adaugaRuta("Vrsac", "Pancevo", 68, false, true, true, false);
            adaugaRuta("Anina", "Mehadia", 83, false, true, true, false);
            adaugaRuta("Mehadia", "Orsova", 24,false, true, true, false);
            adaugaRuta("Orsova", "Moldova Noua", 106, false, true, true, false);

            
    }
    
    
   // MATCH - returneaza distanta dintre 2 localitati primite ca parametru 
 
    public int match(String plecare, String destinatie)
    {
            int dist=0;
            for(int i=0;i< nrRute; i++)
            {
                    if(rute[i].getLocalitatePlecare().equals(destinatie)&& rute[i].getLocalitateSosire().equals(plecare)&& rute[i].isSkip()==false)
                    {
                            dist=rute[i].getDistanta();
                            rute[i].setSkip(true);
                    }
            }
            return dist;
    }
    
    
    //FIND- returneaza/genereaza  un drum care nu a fost folosit anterior 
    public Ruta find(String from)
    {
            Ruta r=null;
            for(int i=0; i<nrRute; i++)
            {
                    if(rute[i].getLocalitatePlecare().equals(from) && rute[i].isSkip()==false)
                    {
                            r=new Ruta(from, rute[i].getLocalitateSosire(), rute[i].getDistanta(), rute[i].isSkip(), rute[i].isFluvial(), rute[i].isRutier(), rute[i].isFeroviar());
                            rute[i].setSkip(true);
                    }
            }
            return r;
    }
    
   
    
    @SuppressWarnings("unchecked")
	public void calculRuta(String from, String to)
    {
            
    		int dist=0;
            Ruta z ;
            if(match(from, to)>0)
            {
                    
            		s.push(match(from, to));
                    dist=(Integer)s.pop();  
                    //return ;    
                    
            }
            else
            {
                    
                    z=find(from); //  aplica metoda find
                    if(z!=null)
                    {
                            //distanta de la nodul curent la primul succesor
                            System.out.println("Din "+z.getLocalitatePlecare()+" pana in "+z.getLocalitateSosire()+" s-au parcurs "+z.getDistanta()+" km");
                            s.push(z.getDistanta());
                           
                            
                            if( z.getLocalitateSosire().equals(to))
                            {
                               
                             while(!s.empty())
                             	{
                                 dist=dist+ (Integer)s.pop();//face suma distantelor pana la destinatie    
                             	}
                             System.out.println("traseul final are\n                    "+ dist + " km.");
                             return;
                            }
                            else
                                    calculRuta(z.getLocalitateSosire(), to);
                    }
                    
            }
            
            
    }
    

    
    
    
    
}

